package config

import (
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"strings"

	"github.com/golang/glog"
)

type Config struct {
	Serial_number       string `json:"serial_number,omitempty"`       //对应JSON的serial_number,如果为空置则忽略字段
	Log_dir             string `json:"log_dir,omitempty"`             //对应JSON的 log_dir,如果为空置则忽略字段
	Log_v               string `json:"log_v,omitempty"`               //对应JSON的 log_v,如果为空置则忽略字段
	Log_maxSize         uint64 `json:"log_maxSize,omitempty"`         //对应JSON的 log_maxSize,如果为空置则忽略字段
	Service_name        string `json:"service_name,omitempty"`        //对应JSON的 service_name,如果为空置则忽略字段
	Service_displayname string `json:"service_displayname,omitempty"` //对应JSON的 service_displayname,如果为空置则忽略字段
	Sercice_desc        string `json:"sercice_desc,omitempty"`        //对应JSON的 sercice_desc,如果为空置则忽略字段
	Http_Port           string `json:"http_port,omitempty"`           //对应JSON的 http_port,如果为空置则忽略字段
	Https_port          string `json:"https_port,omitempty"`          //对应JSON的 https_port,如果为空置则忽略字段
	Db_url              string `json:"db_url,omitempty"`              //对应JSON的 db_url,如果为空置则忽略字段
	Leveldb_dir         string `json:"leveldb_dir,omitempty"`         //对应JSON的 leveldb_dir,如果为空置则忽略字段 cache数据库
	Token_type          string `json:"token_type,omitempty"`
	App_id              string `json:"app_id,omitempty"`
	App_secret          string `json:"app_secret,omitempty"`
	Login_url           string `json:"login_url,omitempty"`
	Check_token_url     string `json:"check_token_url,omitempty"`
	Refresh_token_url   string `json:"refresh_token_url,omitempty"`
	IsDev               bool   `json:"is_dev,omitempty"`       //是否是开发版本
	Get_verify_url      string `json:"verify_url,omitempty"`   //获取验证码URL
	Get_doaction_url    string `json:"doaction_url,omitempty"` //注册或修改密码URL
	Get_file_head_url   string `json:"file_head_url"`          //file url 头
	Small_Appid         string `json:"small_appid"`
	Small_Secret        string `json:"small_secret"`
	Wx_AppID            string `json:"wx_appid"`
	Wx_AppSecret        string `json:"wx_appSecret"`
	Wx_Token            string `json:"wx_token"`
	Wx_EncodingAESKey   string `json:"wx_encodingAESKey"`
	Wx_NotifyUrl        string `json:"wx_notifyUrl"`
	Wx_authorize_url    string `json:"wx_authorize_url"`
	Rank_url            string `json:"rank_url"`
	Wx_apiKey           string `json:"wx_apiKey"`
	Wx_mchId            string `json:"wx_mchId"`
	External_iPAddr     string `json:"external_iPAddr"`
	Es_addr_url         string `json:"es_addr_url"`
	Rank_count          int    `json:"rank_count"` //排名人数
	Shake_url           string `json:"shake_url"`
}

const (
	Url_host  = "/reeserver"
	File_host = "/file"
)

var Static_host = [2]string{"d:/test", "/temple"}
var _map = Config{}

func init() {
	onInit()
	flag.Parse()
}

func onInit() {
	file, _ := exec.LookPath(os.Args[0])
	path, _ := filepath.Abs(file)
	path = filepath.Dir(path)

	err := InitFile(path + "/config.json")
	if err != nil {
		fmt.Println("InitFile: ", err.Error())
		return
	}

	//创建服务器日志目录
	os.MkdirAll(_map.Log_dir, os.ModePerm) //生成多级目录
	//------------------------end

	flag.Set("v", _map.Log_v)         //初始化命令行参数
	flag.Set("log_dir", _map.Log_dir) //初始化命令行参数 默认目录
	glog.MaxSize = 1024 * 1024 * _map.Log_maxSize
}

//是否是开发版本
func OnIsDev() bool {
	return _map.IsDev
}

//获取端口号
func GetServerPort() (strPort string) {
	strPort = _map.Http_Port
	return
}

//获取端口号
func GetServerHttpsPort() (strPort string) {
	strPort = _map.Https_port
	return
}

//获取db连接字符串
func GetDbUrl() (strMysqlUrl string) {
	strMysqlUrl = _map.Db_url
	return
}

//获取Leveldb的文件地址
func GetLevelDbDir() (strLeveldb_dir string) {
	strLeveldb_dir = _map.Leveldb_dir
	return
}

func InitFile(filename string) error {
	bytes, err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Println("ReadFile: ", err.Error())
		return err
	}

	if err := json.Unmarshal(bytes, &_map); err != nil {
		fmt.Println("Unmarshal: ", err.Error())
		return err
	}

	return nil
}

//设置日志级别
func SetFlag(f int) {
	str2 := fmt.Sprintf("%d", f)
	flag.Set("v", str2) //初始化命令行参数
}

//设置日志输出目录
func SetOutPutDir(outDir string) {
	flag.Set("log_dir", outDir) //初始化命令行参数
}

//获取service配置信息
func GetServiceConfig() (name, displayName, desc string) {
	name = _map.Service_name
	displayName = _map.Service_displayname
	desc = _map.Sercice_desc
	return
}

//获取token类型
func GetTokenType() string {
	return _map.Token_type
}

//获取授权信息码
func GetAppInfo() (appid, appsecret string) {
	appid = _map.App_id
	appsecret = _map.App_secret
	return
}

func GetLoginUrl() string {
	return _map.Login_url
}

func GetCheckTokenUrl() string {
	return _map.Check_token_url
}

func GetRefreshTokenUrl() string {
	return _map.Refresh_token_url
}

type VerifyInfo struct {
	Url        string
	AppId      string
	App_secret string
}

//获取验证码配置信息
func GetVerifyInfo() (verifyInfo VerifyInfo) {
	verifyInfo.Url = _map.Get_verify_url
	verifyInfo.AppId = _map.App_id
	verifyInfo.App_secret = _map.App_secret
	return
}

type DoactionInfo struct {
	Url        string
	AppId      string
	App_secret string
}

//获取注册或修改密码配置信息
func GetDoactionInfo() (doactionInfo DoactionInfo) {
	doactionInfo.Url = _map.Get_doaction_url
	doactionInfo.AppId = _map.App_id
	doactionInfo.App_secret = _map.App_secret
	return
}

func GetFileHeadUrl() string {
	return _map.Get_file_head_url
}

func GetSmallAppid() (Small_Appid, Small_Secret string) {
	Small_Appid = _map.Small_Appid
	Small_Secret = _map.Small_Secret
	return
}

type WxInfo struct {
	AppID          string
	AppSecret      string
	MchId          string
	Key            string
	Token          string
	EncodingAESKey string
	NotifyUrl      string
}

func GetWxInfo() WxInfo {
	return WxInfo{_map.Wx_AppID,
		_map.Wx_AppSecret,
		_map.Wx_mchId,
		_map.Wx_apiKey,
		_map.Wx_Token,
		_map.Wx_EncodingAESKey,
		_map.Wx_NotifyUrl,
	}
}

func GetWxAuthorizeUrl() string {
	return _map.Wx_authorize_url
}

func GetRank_url() string {
	return _map.Rank_url
}

func GetShake_url() string {
	return _map.Shake_url
}

func GetWx_apiKey() string {
	return _map.Wx_apiKey
}

func GetWx_mchId() string {
	return _map.Wx_mchId
}

//公网IP
func GetExternal_iPAddr() string {
	return _map.External_iPAddr
}
func GetEsAddrUrl() string {
	return _map.Es_addr_url
}

//判断是否在测试环境下使用
func IsRunTesting() bool {
	if len(os.Args) > 1 {
		fmt.Println(os.Args[1])
		return strings.HasPrefix(os.Args[1], "-test")
	}
	return false
}

//刷新
//func Flush() {
//	glog.Flush()
//}

func GetRank_count() int {
	return _map.Rank_count
}
